<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('clock_in_records', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id'); // 用户ID
            $table->unsignedBigInteger('employee_id')->nullable(); // 员工ID

            // 打卡基本信息
            $table->enum('type', ['check_in', 'check_out', 'makeup']); // 打卡类型：上班、下班、补卡
            $table->datetime('clock_time'); // 打卡时间
            $table->date('work_date'); // 工作日期（用于跨日考勤）

            // 位置信息
            $table->string('ip_address')->nullable(); // IP地址
            $table->decimal('latitude', 10, 7)->nullable(); // 纬度
            $table->decimal('longitude', 10, 7)->nullable(); // 经度
            $table->string('location_address')->nullable(); // 位置地址
            $table->string('device_info')->nullable(); // 设备信息

            // 打卡状态
            $table->enum('status', ['normal', 'late', 'early', 'absent', 'makeup_pending', 'makeup_approved', 'makeup_rejected'])
                  ->default('normal'); // 打卡状态

            // 考勤规则关联
            $table->unsignedBigInteger('attendance_rule_id')->nullable(); // 关联的考勤规则

            // 异常信息
            $table->integer('late_minutes')->default(0); // 迟到分钟数
            $table->integer('early_minutes')->default(0); // 早退分钟数
            $table->text('exception_reason')->nullable(); // 异常原因

            // 补卡相关
            $table->boolean('is_makeup')->default(false); // 是否补卡
            $table->text('makeup_reason')->nullable(); // 补卡原因
            $table->text('approval_note')->nullable(); // 审批备注
            $table->unsignedBigInteger('approved_by')->nullable(); // 审批人
            $table->datetime('approved_at')->nullable(); // 审批时间

            // 来源
            $table->enum('source', ['manual', 'machine', 'app', 'web', 'import'])->default('manual'); // 打卡来源

            // 额外数据
            $table->json('extra_data')->nullable(); // 额外数据（如打卡机信息）

            $table->timestamps();

            // 索引
            $table->index(['user_id', 'work_date']);
            $table->index(['employee_id', 'work_date']);
            $table->index('clock_time');
            $table->index('status');

            // 外键约束
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('employee_id')->references('id')->on('employees')->onDelete('cascade');
            $table->foreign('attendance_rule_id')->references('id')->on('attendance_rules')->onDelete('set null');
            $table->foreign('approved_by')->references('id')->on('users')->onDelete('set null');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('clock_in_records');
    }
};
